// Copyright 2007, 2008, 2009 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package net.aramzamzam.tapestry.judo.components;

import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.Mixin;
import org.apache.tapestry5.annotations.SupportsInformalParameters;
import org.apache.tapestry5.ioc.annotations.Inject;


/**
 * A Zone is portion of the output page designed for easy dynamic updating via Ajax or other client-side effects.  A
 * Zone renders out as a &lt;div&gt; element (or whatever is specified in the template) and may have content initially,
 * or may only get its content as a result of client side activity.
 * <p/>
 * Often, Zones are initially invisible, in which case the visible parameter may be set to false (it defaults to true).
 * <p/>
 * When a user clicks an {@link org.apache.tapestry5.corelib.components.ActionLink} whose zone parameter is set, the
 * corresponding client-side Tapestry.ZoneManager object is located. It will update the content of the Zone's
 * &lt;div&gt; and then invoke either a show method (if the div is not visible) or an update method (if the div is
 * visible).  The show and update parameters are the <em>names</em> of functions attached to the Tapestry.ElementEffect
 * object.    Likewise, a {@link org.apache.tapestry5.corelib.components.Form} component may also trigger an update of a
 * client-side Zone.
 * <p/>
 * The server side event handler can return a {@link org.apache.tapestry5.Block} or a component to render as the new
 * content on the client side. Often, re-rendering the Zone's {@linkplain #getBody() body} is useful. Multiple
 * client-side zones may be updated by returning a {@link org.apache.tapestry5.ajax.MultiZoneUpdate}.
 * <p/>
 * Renders informal parameters, adding CSS class "t-zone" and possibly, "t-invisible".
 * <p/>
 * You will often want to specify the id parameter of the Zone, in addition to it's Tapestry component id; this "locks
 * down" the client-side id, so the same value is used even in later partial renders of the page (essential if the Zone
 * is nested inside another Zone).  When you specify the client-side id, it is used exactly as provided (meaning that
 * you are responsible for ensuring that there will not be an id conflict even in the face of multiple partial renders
 * of the page). Failure to provide an explicit id results in a new, and non-predictable, id being generated for each
 * partial render, which will often result in client-side failures to locate the element to update when the Zone is
 * triggered.
 * <p/>
 * After the client-side content is updated, a client-side event is fired on the zone's element. The constant
 * Tapestry.ZONE_UPDATED_EVENT can be used to listen to the event.
 */
@SupportsInformalParameters
public class Zone extends Any
{
	@SuppressWarnings("unused")
	@Mixin
	private net.aramzamzam.tapestry.judo.mixins.Zone zoneMixin;
	
	@Inject
    private ComponentResources resources;
	
	 /**
     * Returns the zone's body (the content enclosed by its start and end tags). This is often used as part of an Ajax
     * partial page render to update the client with a fresh render of the content inside the zone.
     *
     * @return the zone's body as a Block
     */
    public Block getBody()
    {
        return resources.getBody();
    }
}
